package com.yyn.educenter.controller;

import com.google.gson.Gson;
import com.yyn.JwtUtil;
import com.yyn.R;
import com.yyn.educenter.entity.UcenterMember;
import com.yyn.educenter.service.UcenterMemberService;
import com.yyn.educenter.utils.ConstantPropertiesUtil;
import com.yyn.educenter.utils.HttpClientUtils;
import com.yyn.servicebase.exceptionhandler.CustomException;
import org.apache.http.client.HttpClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;

@CrossOrigin
@Controller //只需要请求地址 不需要返回数据
@RequestMapping("/api/ucenter/wx")
public class WcApiController {
    @Autowired
    UcenterMemberService ucenterMemberService;
    //    扫码登录后跳转的接口
//    第一步拿到code
    @GetMapping("/callback")
    public String callback(String code, String state) {
        String jwtToken = null;
//        第二步：通过code得到access_token id  同时给该微信绑定微信id
        String baseUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +
                "?appid=%s" +
                "&secret=%s" +  //秘钥
                "&code=%s" +
                "&grant_type=%s";
        String accessTokenUrl = String.format(
                baseUrl,
                ConstantPropertiesUtil.WX_OPEN_APP_ID,
                ConstantPropertiesUtil.WX_OPEN_APP_SECRET,
                code,
                "authorization_code"
        );
        try {
            URLEncoder.encode(accessTokenUrl, "UTF-8"); //url编码
//            不依靠网页实现请求路径跳转  并获得值
//            获得token和openid  //得到该微信号的唯一属性信息
            String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);
//          **Gson**：用于String转Json
            Gson gson = new Gson();
//            HashMap 哈希表 key，value  把json的 ”key“:“vaule”
            HashMap hashMap = gson.fromJson(accessTokenInfo, HashMap.class);
            String access_token = (String) hashMap.get("access_token");
            String openid = (String) hashMap.get("openid");
//
//            第四步：把信息添加到数据库
//            只需添加一次  判断表里是否有值（用微信id判断）
            UcenterMember ucenterMember = ucenterMemberService.getUcenterMemberByOpenid(openid);
            if(ucenterMember == null){
//                这里是已经判断了用户是否第一次扫码
//                如果用户没扫描过再进行对基本信息的获取
//                第三步：通过accessToken 得到用户基本信息
                String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +
                        "?access_token=%s" +
                        "&openid=%s" +
                        "&lang=%s";
                String userInfoUrl = String.format(
                        baseUserInfoUrl,
                        access_token,
                        openid,
                        "zh_CN"
                );
//        发送有返回值的请求
                String userInfo = HttpClientUtils.get(userInfoUrl);
//            把返回值转为哈希json
                HashMap userInfoJson = gson.fromJson(userInfo, HashMap.class);
                String nickname = (String) userInfoJson.get("nickname");
                String headimgurl = (String)userInfoJson.get("headimgurl");//头像
                UcenterMember member = new UcenterMember();
                member.setOpenid(openid);
                member.setNickname(nickname);
                member.setAvatar(headimgurl);
                ucenterMemberService.save(member);
//  2、我们要通过**jwt**生成一个token值 然后**把token值通过路径来传递**到任何一个路径
                jwtToken = JwtUtil.getJwtToken(member.getId(), member.getNickname());
                System.out.println(jwtToken);
                return "redirect:http://localhost:3000?token="+jwtToken;

            }
        } catch (Exception e) {
            throw new CustomException(20001, e.getMessage());
        }
//        token为参数 到时候可以通过解码得到id然后得到对应的对象信息
        return "redirect:http://localhost:3000";

    }

    //    重定向到微信开发平台  通过传参到指定的二维码界面
    @GetMapping("wxlogin")
    public String genQrConnect(HttpServletRequest session) {
        // 微信开放平台授权baseUrl
        String baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +
                "?appid=%s" +
                "&redirect_uri=%s" +
                "&response_type=code" +
                "&scope=snsapi_login" +
                "&state=%s" +
                "#wechat_redirect";
// 回调地址
        String redirectUrl = ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL; //获取业务服务器重定向地址
        try {
//            重定向   编码
            redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8"); //url编码
        } catch (UnsupportedEncodingException e) {
            throw new CustomException(20001, e.getMessage());
        }
        String qrcodeUrl = String.format(
                baseUrl,
                ConstantPropertiesUtil.WX_OPEN_APP_ID,
                ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL,
                "atguigu"
        );
//        最终请求这个地址  重定向（当请求了到这一步就请求这个地址）
        return "redirect:" + qrcodeUrl;
    }
}
